class Hook {
    constructor(args = []) {
        this.args = args
        this.taps = []  // 将来用于存放组装的 {}
        this._x = undefined     // 将来在代码工厂函数中会给 _x = [fn1, fn2, ...]
    }

    tap(options, fn) {
        if (typeof options === 'string') {
            options = {
                name: options
            }
            options = Object.assign({fn}, options)
            // 将组装好的 options 添加到 []
            this._insert(options)
        }
    }

    tapAsync(options, fn) {
        if (typeof options === 'string') {
            options = {
                name: options
            }
            options = Object.assign({fn}, options)
            // 将组装好的 options 添加到 []
            this._insert(options)
        }
    }

    _insert(options) {
        this.taps[this.taps.length] = options
    }

    call(...args) {
        // 创建将来要具体执行的代码结构
        let callFn = this._createCall()
        // 调用上述的函数 args 传进去
        return callFn.apply(this, args)
    }

    callAsync(...args) {
        // 创建将来要具体执行的代码结构
        let callFn = this._createCall()
        // 调用上述的函数 args 传进去
        return callFn.apply(this, args)
    }

    _createCall() {
        return this.compile({
            taps: this.taps,
            args: this.args
        })
    }
}


module.exports = Hook
